package com.windchime.blog.controller.admin;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo;
import com.windchime.blog.entity.Blog;
import com.windchime.blog.entity.Tag;
import com.windchime.blog.entity.Type;
import com.windchime.blog.entity.vo.TagSearch;
import com.windchime.blog.entity.vo.TypeOrTagVo;
import com.windchime.blog.result.R;
import com.windchime.blog.service.BlogService;
import com.windchime.blog.service.TagService;
import com.windchime.blog.utils.StringSplitUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 标签表 前端控制器
 * </p>
 *
 * @author WindChime
 * @since 2021-08-02
 */
@RestController
@RequestMapping("/admin/tag")
public class AdminTagController {

    @Autowired
    private TagService tagService;

    @Autowired
    private BlogService blogService;

    /**
     * 分页查询带条件
     * @param page 当前页
     * @param limit 当前页条目数
     * @param tagSearch 条件
     * @return tags
     */
    @GetMapping("/selectTagList")
    public R selectTagList(Integer page, Integer limit, TagSearch tagSearch) {
        PageInfo<Tag> tags = tagService.selectTagList(page, limit, tagSearch);
        return R.ok().code(0).msg("").count(tags.getTotal()).data("tags", tags.getList());
    }

    /**
     * 查询所有标签--给博客添加和修改页面使用
     * @return types
     */
    @PostMapping("/selectAll")
    public R selectAll() {
        List<Tag> tags = tagService.list();
        List<TypeOrTagVo> typeOrTagVos = tags.stream().map(tag -> new TypeOrTagVo(tag.getName(), tag.getId())).collect(Collectors.toList());
        return R.ok().data("tags", typeOrTagVos);
    }

    /**
     * 通过博客ID获取到该博客有什么标签
     * @param id 博客ID
     * @return tagSelect
     */
    @GetMapping("/selectChecked/{id}")
    public R selectChecked(@PathVariable Long id) {
        Blog blog = blogService.getById(id);
        String tagIds = blog.getTagIds();
        List<Long> ids = StringSplitUtil.split(tagIds, ",");
        List<TypeOrTagVo> typeOrTagVos = ids.stream().map(tagId -> {
            Tag tag = tagService.getById(tagId);
            return new TypeOrTagVo(tag.getName(), tag.getId());
        }).collect(Collectors.toList());
        return R.ok().data("tagSelect", typeOrTagVos);
    }

    /**
     * 保存标签
     * @param tag 标签
     * @return true
     */
    @PostMapping("/saveTag")
    public R saveTag(Tag tag) {
        boolean b = tagService.saveTag(tag);
        if (b) {
            return R.ok().msg("添加成功");
        } else {
            return R.error().msg("已有该标签,请重新输入标签名");
        }
    }

    /**
     * 修改标签
     * @param tag 分类
     * @return true
     */
    @PostMapping("/editTag")
    public R editTag(Tag tag) {
        boolean b = tagService.editTag(tag);
        if (b) {
            return R.ok().msg("修改成功");
        } else {
            return R.error().msg("标签名已被使用,请重新修改");
        }
    }

    /**
     * 删除标签
     * @param id 分类ID
     * @return true
     */
    @GetMapping("/deleteTag/{id}")
    public R deleteTag(@PathVariable Long id) {
        boolean b = tagService.removeById(id);
        if (b) {
            return R.ok().msg("删除成功");
        } else {
            return R.error().msg("删除失败");
        }
    }

    /**
     * 批量删除
     * @param ids ids数组字符串
     * @return true
     */
    @GetMapping("/deleteTags/{ids}")
    public R deleteTag(@PathVariable String ids) {
        List<Long> idList = StringSplitUtil.split(ids, ",");
        boolean b = tagService.removeByIds(idList);
        if (b) {
            return R.ok().msg("批量删除成功");
        } else {
            return R.error().msg("批量删除失败");
        }
    }

}

